Pythonã®ãemailãããã±ãŒãžã䜿ãããªããŸããããè€éãªMIMEã¡ãã»ãŒãžãæ§ç¯ããåä¿¡ã¡ãŒã«ãè§£æããŠå¹æçãã€ã°ããŒãã«ã«ããŒã¿ãæœåºããæ¹æ³ãåŠã³ãŸãã
Pythonã®Emailããã±ãŒãžãç¿åŸããïŒMIMEã¡ãã»ãŒãžæ§ç¯ãšå ç¢ãªè§£æã®æè¡
ã¡ãŒã«ã¯ã°ããŒãã«ã³ãã¥ãã±ãŒã·ã§ã³ã®åºç€ã§ããç¶ããå人çãªããåããããžãã¹éå¶ãèªåã·ã¹ãã éç¥ã«äžå¯æ¬ ã§ãããªããããã¹ãã®ã¡ãŒã«ãæ·»ä»ãã¡ã€ã«ãäžå¯§ã«ãã©ãŒãããããã眲åã®èåŸã«ã¯ãMultipurpose Internet Mail Extensions (MIME) ã®è€éããé ãããŠããŸããéçºè ãç¹ã«Pythonãæ±ãéçºè ã«ãšã£ãŠããããã®MIMEã¡ãã»ãŒãžãããã°ã©ã ã§æ§ç¯ãè§£æããæ¹æ³ãç¿åŸããããšã¯ã極ããŠéèŠãªã¹ãã«ã§ãã
Pythonã«çµã¿èŸŒãŸããŠããemail
ããã±ãŒãžã¯ãã¡ãŒã«ã¡ãã»ãŒãžãåŠçããããã®å
ç¢ã§å
æ¬çãªãã¬ãŒã ã¯ãŒã¯ãæäŸããŸããããã¯åã«ã·ã³ãã«ãªããã¹ããéä¿¡ããããã ãã§ã¯ãªããMIMEã®è€éãªè©³çŽ°ãæœè±¡åããé«åºŠãªã¡ãŒã«ãäœæããããåä¿¡ã¡ãŒã«ããç¹å®ã®ããŒã¿ãé©ãã»ã©æ£ç¢ºã«æœåºãããã§ããããã«èšèšãããŠããŸãããã®ã¬ã€ãã§ã¯ããã®ããã±ãŒãžã®2ã€ã®äž»èŠãªåŽé¢ãããªãã¡éä¿¡çšã®MIMEã¡ãã»ãŒãžã®æ§ç¯ãšããŒã¿æœåºã®ããã®è§£æã«ã€ããŠæ·±ãæãäžãããã¹ããã©ã¯ãã£ã¹ã«ã€ããŠã°ããŒãã«ãªèŠç¹ãæäŸããŸãã
æ§ç¯ãšè§£æã®äž¡æ¹ãçè§£ããããšã¯äžå¯æ¬ ã§ããã¡ãã»ãŒãžãæ§ç¯ãããšãã¯ãæ¬è³ªçã«å¥ã®ã·ã¹ãã ãè§£éããããã®æ§é ãšã³ã³ãã³ããå®çŸ©ããŠããŸããè§£æãããšãã¯ãå¥ã®ã·ã¹ãã ã«ãã£ãŠå®çŸ©ãããæ§é ãšã³ã³ãã³ããè§£éããŸããäžæ¹ãæ·±ãçè§£ããããšã¯ãããäžæ¹ãç¿åŸããã®ã«å€§ãã«åœ¹ç«ã¡ãããå ç¢ã§çžäºéçšå¯èœãªã¡ãŒã«ã¢ããªã±ãŒã·ã§ã³ã«ã€ãªãããŸãã
MIMEãçè§£ããïŒã¢ãã³ã¡ãŒã«ã®åºç€
Pythonã®å ·äœçãªå 容ã«å ¥ãåã«ãMIMEãšã¯äœãããããŠãªããããéåžžã«éèŠãªã®ããææ¡ããŠããããšãäžå¯æ¬ ã§ããããšããšãã¡ãŒã«ã¡ãã»ãŒãžã¯ãã¬ãŒã³ããã¹ãïŒ7ãããASCIIæåïŒã«éå®ãããŠããŸããã1990幎代åé ã«å°å ¥ãããMIMEã¯ãã¡ãŒã«ã®æ©èœãæ¡åŒµããŠä»¥äžããµããŒãããããã«ãªããŸããã
- éASCIIæåïŒã¢ã©ãã¢èªãäžåœèªããã·ã¢èªããŸãã¯ASCIIã»ããå€ã®æåã䜿çšãããã®ä»ã®èšèªã®ããã¹ããèš±å¯ããŸãã
- æ·»ä»ãã¡ã€ã«ïŒããã¥ã¡ã³ããç»åãé³å£°ãåç»ãªã©ã®ãã¡ã€ã«ãéä¿¡ããŸãã
- ãªããããã¹ããã©ãŒãããïŒå€ªåãæäœãè²ãã¬ã€ã¢ãŠããå«ãHTMLã¡ãŒã«ã
- è€æ°ããŒãïŒãã¬ãŒã³ããã¹ããHTMLãæ·»ä»ãã¡ã€ã«ãåäžã®ã¡ãŒã«å ã«çµåããŸãã
MIMEã¯ãã¡ãŒã«ã¡ãã»ãŒãžã«ç¹å®ã®ããããŒã远å ãããã®æ¬æãããŸããŸãªãããŒããã«æ§é åããããšã§ãããå®çŸããŸããééããäž»ãªMIMEããããŒã«ã¯æ¬¡ã®ãããªãã®ããããŸãã
Content-Type:
ããŒãå ã®ããŒã¿ã®çš®é¡ãæå®ããŸãïŒäŸïŒtext/plain
ãtext/html
ãimage/jpeg
ãapplication/pdf
ãmultipart/alternative
ïŒãå€ãã®å Žåãcharset
ãã©ã¡ãŒã¿ãŒïŒäŸïŒcharset=utf-8
ïŒãå«ãŸããŸããContent-Transfer-Encoding:
ã¡ãŒã«ã¯ã©ã€ã¢ã³ããã³ã³ãã³ããã©ã®ããã«ãã³ãŒããã¹ããã瀺ããŸãïŒäŸïŒãã€ããªããŒã¿ã®å Žåã¯base64
ãäž»ã«ããã¹ãã§éASCIIæåãå«ãå Žåã¯quoted-printable
ïŒãContent-Disposition:
åä¿¡è ã®ã¡ãŒã«ã¯ã©ã€ã¢ã³ããããŒããã©ã®ããã«è¡šç€ºãã¹ããã瀺åããŸãïŒäŸïŒã¡ãã»ãŒãžæ¬æå ã«è¡šç€ºããå Žåã¯inline
ãä¿åãããã¡ã€ã«ã®å Žåã¯attachment
ïŒã
Pythonã®email
ããã±ãŒãžïŒè©³çŽ°è§£èª¬
Pythonã®email
ããã±ãŒãžã¯ãã¡ãŒã«ã¡ãã»ãŒãžãããã°ã©ã ã§äœæãè§£æã倿Žããããã«èšèšãããå
æ¬çãªã©ã€ãã©ãªã§ããã¡ãŒã«ã®æ§é ã衚ãMessage
ãªããžã§ã¯ãã®æŠå¿µãäžå¿ã«æ§ç¯ãããŠããŸãã
ãã®ããã±ãŒãžå ã®äž»èŠãªã¢ãžã¥ãŒã«ã¯ä»¥äžã®éãã§ãã
email.message:
ã³ã¢ãšãªãEmailMessage
ã¯ã©ã¹ãå«ã¿ãŸããããã¯ã¡ãŒã«ã¡ãã»ãŒãžãäœæããã³æäœããããã®äž»èŠãªã€ã³ã¿ãŒãã§ãŒã¹ã§ããMIMEã®è©³çްãèªåçã«åŠçããéåžžã«æè»ãªã¯ã©ã¹ã§ããemail.mime:
MIMEæ§é ãããæç€ºçã«å¶åŸ¡ã§ããã¬ã¬ã·ãŒãªã¯ã©ã¹ïŒMIMEText
ãMIMEMultipart
ãªã©ïŒãæäŸããŸããæ°ããã³ãŒãã§ã¯ãã®ç°¡æœãããEmailMessage
ãäžè¬çã«æšå¥šãããŸããããããã®ã¯ã©ã¹ãçè§£ããŠããããšã¯æçã§ããemail.parser:
çã®ã¡ãŒã«ããŒã¿ïŒãã€ããŸãã¯æååïŒãEmailMessage
ãªããžã§ã¯ãã«å€æããããã®BytesParser
ãParser
ãªã©ã®ã¯ã©ã¹ãæäŸããŸããemail.policy:
ã¡ãŒã«ã¡ãã»ãŒãžãã©ã®ããã«æ§ç¯ã»è§£æãããããå¶åŸ¡ããããªã·ãŒãå®çŸ©ããããããŒã®ãšã³ã³ãŒãã£ã³ã°ãæ¹è¡ã³ãŒãããšã©ãŒåŠçã«åœ±é¿ãäžããŸãã
ã»ãšãã©ã®çŸä»£çãªãŠãŒã¹ã±ãŒã¹ã§ã¯ãæ§ç¯ãšè§£æãããã¡ãã»ãŒãžãªããžã§ã¯ãã®äž¡æ¹ã§ãäž»ã«email.message.EmailMessage
ã¯ã©ã¹ãæäœããããšã«ãªããŸãããã®ã¡ãœããã¯ãåŸæ¥ã®email.mime
ã¯ã©ã¹ã§ã®ããåé·ãªããã»ã¹ã倧å¹
ã«ç°¡çŽ åããŸãã
MIMEã¡ãã»ãŒãžã®æ§ç¯ïŒç²Ÿå¯ãªã¡ãŒã«äœæ
ã¡ãŒã«ã®æ§ç¯ã«ã¯ãããŸããŸãªã³ã³ããŒãã³ãïŒããã¹ããHTMLãæ·»ä»ãã¡ã€ã«ïŒãæå¹ãªMIMEæ§é ã«çµã¿ç«ãŠãäœæ¥ãå«ãŸããŸããEmailMessage
ã¯ã©ã¹ã¯ããã®ããã»ã¹ã倧å¹
ã«å¹çåããŸãã
åºæ¬çãªããã¹ãã¡ãŒã«
æãã·ã³ãã«ãªã¡ãŒã«ã¯ãã¬ãŒã³ããã¹ãã§ããç°¡åã«äœæããåºæ¬çãªããããŒãèšå®ã§ããŸãã
from email.message import EmailMessage
msg = EmailMessage()
msg['Subject'] = 'Pythonããã®ãæšæ¶'
msg['From'] = 'sender@example.com'
msg['To'] = 'recipient@example.com'
msg.set_content('ããã«ã¡ã¯ãããã¯Pythonããéä¿¡ããããã¬ãŒã³ããã¹ãã¡ãŒã«ã§ãã\n\nãããããé¡ãããããŸãã\nããªãã®Pythonã¹ã¯ãªãããã')
print(msg.as_string())
説æïŒ
EmailMessage()
ã¯ç©ºã®ã¡ãã»ãŒãžãªããžã§ã¯ããäœæããŸãã- èŸæžã®ãããªã¢ã¯ã»ã¹ïŒ
msg['Subject'] = ...
ïŒã§å ±éããããŒãèšå®ããŸãã set_content()
ã¯ã¡ãŒã«ã®äž»èŠã³ã³ãã³ãã远å ããŸããããã©ã«ãã§ã¯ãContent-Type: text/plain; charset="utf-8"
ãæšæž¬ããŸããas_string()
ã¯ã¡ãã»ãŒãžãSMTPçµç±ã§éä¿¡ããããã¡ã€ã«ã«ä¿åãããããã®ã«é©ããæåå圢åŒã«ã·ãªã¢ã©ã€ãºããŸãã
HTMLã³ã³ãã³ãã®è¿œå
HTMLã¡ãŒã«ãéä¿¡ããã«ã¯ãset_content()
ãåŒã³åºãéã«ã³ã³ãã³ãã¿ã€ããæå®ããã ãã§ããHTMLãã¬ã³ããªã³ã°ããªãã¡ãŒã«ã¯ã©ã€ã¢ã³ãã䜿çšããŠããåä¿¡è
ããã¢ã¯ã»ã·ããªãã£äžã®çç±ããããã¬ãŒã³ããã¹ãã®ä»£æ¿ãæäŸããããšãè¯ãç¿æ
£ã§ãã
from email.message import EmailMessage
msg = EmailMessage()
msg['Subject'] = 'HTMLãã¥ãŒã¹ã¬ã¿ãŒ'
msg['From'] = 'newsletter@example.com'
msg['To'] = 'subscriber@example.com'
html_content = """
<html>
<head></head>
<body>
<h1>ã°ããŒãã«ã¢ããããŒããžããããïŒ</h1>
<p>賌èªè
ã®çæ§ã</p>
<p>ããã¯äžçäžããã®<strong>ææ°æ
å ±</strong>ã§ãã</p>
<p>詳现ã«ã€ããŠã¯ãåŒç€Ÿã®<a href="http://www.example.com">ãŠã§ããµã€ã</a>ãã芧ãã ããã</p>
<p>ãããããé¡ãããããŸãã<br>ããŒã äžå</p>
</body>
</html>
"""
# HTMLçã远å
msg.add_alternative(html_content, subtype='html')
# ãã¬ãŒã³ããã¹ãã®ä»£æ¿ã远å
plain_text_content = (
"ã°ããŒãã«ã¢ããããŒããžããããïŒ\n\n"
"賌èªè
ã®çæ§ã\n\n"
"ããã¯äžçäžããã®ææ°æ
å ±ã§ãã\n"
"詳现ã«ã€ããŠã¯ãåŒç€Ÿã®ãŠã§ããµã€ããã芧ãã ãã: http://www.example.com\n\n"
"ãããããé¡ãããããŸãã\nããŒã äžå"
)
msg.add_alternative(plain_text_content, subtype='plain')
print(msg.as_string())
説æïŒ
add_alternative()
ã¯ã*åã*ã³ã³ãã³ãã®ç°ãªã衚çŸã远å ããããã«äœ¿çšãããŸããã¡ãŒã«ã¯ã©ã€ã¢ã³ãã¯ãåŠçã§ãããæé©ãªããã®ã衚瀺ããŸãïŒéåžžã¯HTMLïŒã- ããã«ãããèªåçã«
multipart/alternative
MIMEæ§é ãäœæãããŸãã
æ·»ä»ãã¡ã€ã«ã®åŠç
add_attachment()
ã䜿çšãããã¡ã€ã«ã®æ·»ä»ã¯ç°¡åã§ããããããçš®é¡ã®ãã¡ã€ã«ãæ·»ä»ã§ããããã±ãŒãžãé©åãªMIMEã¿ã€ããšãšã³ã³ãŒãã£ã³ã°ïŒéåžžã¯base64
ïŒãåŠçããŸãã
from email.message import EmailMessage
from pathlib import Path
# ãã¢ã³ã¹ãã¬ãŒã·ã§ã³çšã®ãããŒãã¡ã€ã«ãäœæ
Path('report.pdf').write_bytes(b'%PDF-1.4\n1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj\n2 0 obj<</Count 0>>endobj\nxref\n0 3\n0000000000 65535 f\n0000000009 00000 n\n0000000052 00000 n\ntrailer<</Size 3/Root 1 0 R>>startxref\n104\n%%EOF') # éåžžã«åºæ¬çãªãç¡å¹ãªPDFãã¬ãŒã¹ãã«ããŒ
Path('logo.png').write_bytes(b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x06\x00\x00\x00\x1f\x15\xc4\x89\x00\x00\x00\x0cIDAT\x08\x99c`\x00\x00\x00\x02\x00\x01\xe2!\x00\xa0\x00\x00\x00\x00IEND\xaeB`\x82') # 1x1ã®éæãªPNGãã¬ãŒã¹ãã«ããŒ
msg = EmailMessage()
msg['Subject'] = 'éèŠãªããã¥ã¡ã³ããšç»å'
msg['From'] = 'sender@example.com'
msg['To'] = 'recipient@example.com'
msg.set_content('æ·»ä»ã®ã¬ããŒããšäŒç€Ÿã®ããŽãã確èªãã ããã')
# PDFãã¡ã€ã«ãæ·»ä»
with open('report.pdf', 'rb') as f:
file_data = f.read()
msg.add_attachment(
file_data,
maintype='application',
subtype='pdf',
filename='Annual_Report_2024.pdf'
)
# ç»åãã¡ã€ã«ãæ·»ä»
with open('logo.png', 'rb') as f:
image_data = f.read()
msg.add_attachment(
image_data,
maintype='image',
subtype='png',
filename='CompanyLogo.png'
)
print(msg.as_string())
# ãããŒãã¡ã€ã«ãã¯ãªãŒã³ã¢ãã
Path('report.pdf').unlink()
Path('logo.png').unlink()
説æïŒ
add_attachment()
ã¯ãã¡ã€ã«ã³ã³ãã³ãã®çãã€ãããŒã¿ãåãåããŸããmaintype
ãšsubtype
ã¯MIMEã¿ã€ããæå®ããŸãïŒäŸïŒapplication/pdf
ãimage/png
ïŒããããã¯åä¿¡è ã®ã¡ãŒã«ã¯ã©ã€ã¢ã³ããæ·»ä»ãã¡ã€ã«ãæ£ããèå¥ãåŠçããããã«äžå¯æ¬ ã§ããfilename
ã¯ãæ·»ä»ãã¡ã€ã«ãåä¿¡è ã«ãã£ãŠä¿åãããéã®ãã¡ã€ã«åãæäŸããŸãã- ããã«ãããèªåçã«
multipart/mixed
æ§é ãèšå®ãããŸãã
ãã«ãããŒãã¡ãã»ãŒãžã®äœæ
HTMLæ¬æããã¬ãŒã³ããã¹ãã®ä»£æ¿ãããã³ã€ã³ã©ã€ã³ç»åãé¢é£ãã¡ã€ã«ã®äž¡æ¹ãå«ãã¡ãã»ãŒãžãããå Žåãããè€éãªãã«ãããŒãæ§é ãå¿
èŠã«ãªããŸããEmailMessage
ã¯ã©ã¹ã¯ãadd_related()
ãšadd_alternative()
ã䜿çšããŠãããã€ã³ããªãžã§ã³ãã«åŠçããŸãã
äžè¬çãªã·ããªãªã¯ãHTMLå
ã«ç»åãçŽæ¥åã蟌ãŸããHTMLã¡ãŒã«ïŒãã€ã³ã©ã€ã³ãç»åïŒã§ããããã«ã¯multipart/related
ã䜿çšãããŸãã
from email.message import EmailMessage
from pathlib import Path
# ãã¢ã³ã¹ãã¬ãŒã·ã§ã³çšã®ãããŒç»åãã¡ã€ã«ãäœæïŒ1x1ã®éæãªPNGïŒ
Path('banner.png').write_bytes(b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x06\x00\x00\x00\x1f\x15\xc4\x89\x00\x00\x00\x0cIDAT\x08\x99c`\x00\x00\x00\x02\x00\x01\xe2!\x00\xa0\x00\x00\x00\x00IEND\xaeB`\x82')
msg = EmailMessage()
msg['Subject'] = 'ã€ã³ã©ã€ã³ç»åã®äŸ'
msg['From'] = 'sender@example.com'
msg['To'] = 'recipient@example.com'
# ãã¬ãŒã³ããã¹ãçïŒãã©ãŒã«ããã¯ïŒ
plain_text = 'çŽ æŽããããããŒãã芧ãã ããïŒ\n\n[ç»åïŒBanner.png]\n\nåŒç€Ÿã®ãµã€ããã芧ãã ããã'
msg.set_content(plain_text, subtype='plain') # æåã®ãã¬ãŒã³ããã¹ãã³ã³ãã³ããèšå®
# HTMLçïŒã€ã³ã©ã€ã³ç»åçšã®CIDä»ãïŒ
html_content = """
<html>
<head></head>
<body>
<h1>ææ°ã®ãªãã¡ãŒïŒ</h1>
<p>ã客æ§åäœã</p>
<p>åŒç€Ÿã®ç¹å¥ãªã°ããŒãã«ããã¢ãŒã·ã§ã³ããèŠéããªãïŒ</p>
<img src="cid:my-banner-image" alt="ããã¢ãŒã·ã§ã³ãããŒ">
<p>詳现ã¯ãã¡ã<a href="http://www.example.com">ãã¯ãªãã¯</a>ããŠãã ããã</p>
</body>
</html>
"""
msg.add_alternative(html_content, subtype='html') # HTMLã®ä»£æ¿ã远å
# ã€ã³ã©ã€ã³ç»åïŒé¢é£ã³ã³ãã³ãïŒã远å
with open('banner.png', 'rb') as img_file:
image_data = img_file.read()
msg.add_related(
image_data,
maintype='image',
subtype='png',
cid='my-banner-image' # ãã®CIDã¯HTMLã®'src'ãšäžèŽããŸã
)
print(msg.as_string())
# ãããŒãã¡ã€ã«ãã¯ãªãŒã³ã¢ãã
Path('banner.png').unlink()
説æïŒ
set_content()
ã¯åæã³ã³ãã³ãïŒããã§ã¯ãã¬ãŒã³ããã¹ãïŒã確ç«ããŸããadd_alternative()
ã¯HTMLçã远å ãããã¬ãŒã³ããã¹ããšHTMLããŒããå«ãmultipart/alternative
æ§é ãäœæããŸããadd_related()
ã¯ãã¡ãã»ãŒãžããŒãã®1ã€ã«ãé¢é£ãããã³ã³ãã³ããéåžžã¯HTMLå ã®ã€ã³ã©ã€ã³ç»åã«äœ¿çšãããŸããããã¯cid
ïŒContent-IDïŒãã©ã¡ãŒã¿ãŒãåãåãããããHTMLã®<img src="cid:my-banner-image">
ã¿ã°ã§åç §ãããŸãã- æçµçãªæ§é ã¯ã
multipart/alternative
ããŒããå«ãmultipart/mixed
ïŒå€éšæ·»ä»ãã¡ã€ã«ããã£ãå ŽåïŒãšãªãããã®multipart/alternative
ããŒããããã«multipart/related
ããŒããå«ã¿ãŸããmultipart/related
ããŒãã«ã¯HTMLãšã€ã³ã©ã€ã³ç»åãå«ãŸããŸããEmailMessage
ã¯ã©ã¹ããã®ãã¹ãã®è€éããåŠçããŠãããŸãã
ã°ããŒãã«å¯Ÿå¿ã®ããã®ãšã³ã³ãŒãã£ã³ã°ãšæåã»ãã
åœéçãªã³ãã¥ãã±ãŒã·ã§ã³ã«ãããŠã¯ãé©åãªæåãšã³ã³ãŒãã£ã³ã°ãæãéèŠã§ããemail
ããã±ãŒãžã¯ãããã©ã«ãã§UTF-8ã®äœ¿çšã«ã€ããŠåŒ·ãèŠè§£ãæã£ãŠãããããã¯äžçäžã®å€æ§ãªæåã»ãããåŠçããããã®æ®éçãªæšæºã§ãã
from email.message import EmailMessage
msg = EmailMessage()
msg['Subject'] = 'ã°ããŒãã«æåïŒããã«ã¡ã¯, ÐÑОвеÑ, à€šà€®à€žà¥à€€à¥'
msg['From'] = 'global_sender@example.com'
msg['To'] = 'global_recipient@example.com'
# æ¥æ¬èªããã·ã¢èªããã³ãã£ãŒèªã®æå
content = "ãã®ã¡ãã»ãŒãžã«ã¯å€æ§ãªã°ããŒãã«æåãå«ãŸããŠããŸãïŒ\n"
content += "ããã«ã¡ã¯ (æ¥æ¬èª)\n"
content += "ÐÑÐžÐ²ÐµÑ (ãã·ã¢èª)\n"
content += "à€šà€®à€žà¥à€€à¥ (ãã³ãã£ãŒèª)\n\n"
content += "ãemailãããã±ãŒãžã¯UTF-8ãé©åã«åŠçããŸãã"
msg.set_content(content)
print(msg.as_string())
説æïŒ
set_content()
ãPythonæååãåãåããšãèªåçã«UTF-8ã«ãšã³ã³ãŒãããContent-Type: text/plain; charset="utf-8"
ããããŒãèšå®ããŸãã- ã³ã³ãã³ãããããå¿
èŠãšããå ŽåïŒäŸïŒå€ãã®éASCIIæåãå«ãå ŽåïŒãå€ãã¡ãŒã«ã·ã¹ãã çµç±ã§ã®å®å
šãªéä¿¡ãä¿èšŒããããã«ã
Content-Transfer-Encoding: quoted-printable
ãŸãã¯base64
ãé©çšããå¯èœæ§ããããŸããããã±ãŒãžã¯éžæãããããªã·ãŒã«åŸã£ãŠãããèªåçã«åŠçããŸãã
ã«ã¹ã¿ã ããããŒãšããªã·ãŒ
ã¡ãŒã«ã«ä»»æã®ã«ã¹ã¿ã ããããŒã远å ã§ããŸããããªã·ãŒïŒemail.policy
ããïŒã¯ãã¡ãã»ãŒãžã®åŠçæ¹æ³ãå®çŸ©ããããããŒã®ãšã³ã³ãŒãã£ã³ã°ãæ¹è¡ã³ãŒãããšã©ãŒåŠçãªã©ã®åŽé¢ã«åœ±é¿ãäžããŸããããã©ã«ãã®ããªã·ãŒã¯éåžžè¯å¥œã§ãããå³å¯ãªSMTPæºæ ã®ããã«SMTP
ãéžæããããã«ã¹ã¿ã ããªã·ãŒãå®çŸ©ãããããããšãã§ããŸãã
from email.message import EmailMessage
from email import policy
msg = EmailMessage(policy=policy.SMTP)
msg['Subject'] = 'ã«ã¹ã¿ã ããããŒä»ãã¡ãŒã«'
msg['From'] = 'info@example.org'
msg['To'] = 'user@example.org'
msg['X-Custom-Header'] = 'ããã¯è¿œè·¡çšã®ã«ã¹ã¿ã å€ã§ã'
msg['Reply-To'] = 'support@example.org'
msg.set_content('ãã®ã¡ãŒã«ã¯ã«ã¹ã¿ã ããããŒãšããªã·ãŒã宿ŒããŠããŸãã')
print(msg.as_string())
説æïŒ
policy=policy.SMTP
ã䜿çšãããšãSMTPæšæºãžã®å³å¯ãªæºæ ãä¿èšŒãããããã¯é ä¿¡å¯èœæ§ã«ãšã£ãŠæ¥µããŠéèŠãšãªãå ŽåããããŸãã- ã«ã¹ã¿ã ããããŒã¯æšæºããããŒãšåæ§ã«è¿œå ãããŸãããããã¯éæšæºããããŒã瀺ãããã«
X-
ã§å§ãŸãããšãå€ãã§ãã
MIMEã¡ãã»ãŒãžã®è§£æïŒåä¿¡ã¡ãŒã«ããã®æ å ±æœåº
è§£æãšã¯ãçã®ã¡ãŒã«ããŒã¿ïŒéåžžã¯IMAPçµç±ãŸãã¯ãã¡ã€ã«ããåä¿¡ãããã®ïŒãååŸãããããç°¡åã«æ€æ»ã»æäœã§ããEmailMessage
ãªããžã§ã¯ãã«å€æããããšã§ãã
èªã¿èŸŒã¿ãšåæè§£æ
éåžžãã¡ãŒã«ã¯çã®ãã€ãããŒã¿ãšããŠåä¿¡ãããŸãããã®ç®çã«ã¯email.parser.BytesParser
ïŒãŸãã¯ã³ã³ãããšã³ã¹é¢æ°email.message_from_bytes()
ïŒã䜿çšãããŸãã
from email.parser import BytesParser
from email.policy import default
raw_email_bytes = b"""
From: sender@example.com
To: recipient@example.com
Subject: åºæ¬ããããŒä»ããã¹ãã¡ãŒã«
Date: Mon, 1 Jan 2024 10:00:00 +0000
Content-Type: text/plain; charset="utf-8"
ããã¯ã¡ãŒã«ã®æ¬æã§ãã
ç°¡åãªãã¹ãã§ãã
"""
# BytesParserã䜿çš
parser = BytesParser(policy=default)
msg = parser.parsebytes(raw_email_bytes)
# ãŸãã¯ã³ã³ãããšã³ã¹é¢æ°ã䜿çš
# from email import message_from_bytes
# msg = message_from_bytes(raw_email_bytes, policy=default)
print(f"Subject: {msg['subject']}")
print(f"From: {msg['from']}")
print(f"Content-Type: {msg['Content-Type']}")
説æïŒ
BytesParser
ã¯çã®ãã€ãããŒã¿ïŒã¡ãŒã«ãéä¿¡ãããæ¹æ³ïŒãåãåããEmailMessage
ãªããžã§ã¯ããè¿ããŸããpolicy=default
ã¯è§£æã«ãŒã«ãæå®ããŸãã
ããããŒãžã®ã¢ã¯ã»ã¹
ããããŒã¯èŸæžã®ãããªããŒãä»ããŠç°¡åã«ã¢ã¯ã»ã¹ã§ããŸããããã±ãŒãžã¯ãšã³ã³ãŒããããããããŒïŒäŸïŒåœéæåãå«ãä»¶åïŒã®ãã³ãŒããèªåçã«åŠçããŸãã
# ... (åã®è§£æäŸã®'msg'ãªããžã§ã¯ãã䜿çš)
print(f"Date: {msg['date']}")
print(f"Message ID: {msg['Message-ID'] if 'Message-ID' in msg else 'å©çšäžå¯'}")
# è€æ°ã®ããããŒïŒäŸïŒ'Received'ããããŒïŒã®åŠç
# from email.message import EmailMessage # ãŸã ã€ã³ããŒããããŠããªãå Žå
# from email import message_from_string # ç°¡åãªæååäŸã®å Žå
multi_header_email = message_from_string(
"""
From: a@example.com
To: b@example.com
Subject: ãã«ãããããŒãã¹ã
Received: from client.example.com (client.example.com [192.168.1.100])
by server.example.com (Postfix) with ESMTP id 123456789
for <b@example.com>; Mon, 1 Jan 2024 10:00:00 +0000 (GMT)
Received: from mx.another.com (mx.another.com [192.168.1.101])
by server.example.com (Postfix) with ESMTP id 987654321
for <b@example.com>; Mon, 1 Jan 2024 09:59:00 +0000 (GMT)
æ¬æã®å
容ãããã«å
¥ããŸãã
"""
)
received_headers = multi_header_email.get_all('received')
if received_headers:
print("\nåä¿¡ããããŒïŒ")
for header in received_headers:
print(f"- {header}")
説æïŒ
- ããããŒã«ã¢ã¯ã»ã¹ãããšããã®å€ãæååãšããŠè¿ãããŸãã
get_all('header-name')
ã¯ãè€æ°ååºçŸããå¯èœæ§ã®ããããããŒïŒReceived
ãªã©ïŒã«åœ¹ç«ã¡ãŸãã- ããã±ãŒãžã¯ããããŒã®ãã³ãŒããåŠçããããã
Subject: =?utf-8?Q?Global_Characters:_=E3=81=93=E3=82=93=E3=81=AB=E3=81=A1=E3=81=AF?=
ã®ãããªå€ã¯èªåçã«èªã¿åãå¯èœãªæååã«å€æãããŸãã
æ¬æã³ã³ãã³ãã®æœåº
å®éã®ã¡ãã»ãŒãžæ¬æãæœåºããã«ã¯ãã¡ãã»ãŒãžããã«ãããŒãã§ãããã©ããã確èªããå¿ èŠããããŸãããã«ãããŒãã¡ãã»ãŒãžã®å Žåã¯ããã®ããŒããå埩åŠçããŸãã
from email.message import EmailMessage
from email import message_from_string
multipart_email_raw = """
From: multi@example.com
To: user@example.com
Subject: ãã«ãããŒããã¹ãã¡ãŒã«
Content-Type: multipart/alternative; boundary="_----------=_12345"
--_----------=_12345
Content-Type: text/plain; charset="utf-8"
ãã¬ãŒã³ããã¹ãããŒãããã®ããã«ã¡ã¯ïŒ
--_----------=_12345
Content-Type: text/html; charset="utf-8"
<html>
<body>
<h1>HTMLããŒãããã®ããã«ã¡ã¯ïŒ</h1>
<p>ããã¯<strong>ãªããããã¹ã</strong>ã¡ãŒã«ã§ãã</p>
</body>
</html>
--_----------=_12345--
"""
msg = message_from_string(multipart_email_raw)
if msg.is_multipart():
print("\n--- ãã«ãããŒãã¡ãŒã«æ¬æ ---")
for part in msg.iter_parts():
content_type = part.get_content_type()
charset = part.get_content_charset() or 'utf-8' # æå®ãããŠããªãå Žåã¯utf-8ãããã©ã«ããšãã
payload = part.get_payload(decode=True) # ãã€ããŒããã€ãããã³ãŒã
try:
decoded_content = payload.decode(charset)
print(f"ã³ã³ãã³ãã¿ã€ã: {content_type}, æåã»ãã: {charset}\nã³ã³ãã³ã:\n{decoded_content}\n")
except UnicodeDecodeError:
print(f"ã³ã³ãã³ãã¿ã€ã: {content_type}, æåã»ãã: {charset}\nã³ã³ãã³ã: (ãã€ããªãŸãã¯ãã³ãŒãäžèœãªããŒã¿)\n")
# ãã€ããªããŒã¿ãåŠçãããããã©ãŒã«ããã¯ãšã³ã³ãŒãã£ã³ã°ã詊ã¿ã
else:
print("\n--- ã·ã³ã°ã«ããŒãã¡ãŒã«æ¬æ ---")
charset = msg.get_content_charset() or 'utf-8'
payload = msg.get_payload(decode=True)
try:
decoded_content = payload.decode(charset)
print(f"ã³ã³ãã³ãã¿ã€ã: {msg.get_content_type()}, æåã»ãã: {charset}\nã³ã³ãã³ã:\n{decoded_content}\n")
except UnicodeDecodeError:
print(f"ã³ã³ãã³ã: (ãã€ããªãŸãã¯ãã³ãŒãäžèœãªããŒã¿)\n")
説æïŒ
is_multipart()
ã¯ã¡ãŒã«ãè€æ°ã®ããŒããæã€ãã©ããã倿ããŸããiter_parts()
ã¯ãã«ãããŒãã¡ãã»ãŒãžã®ãã¹ãŠã®ãµãããŒããå埩åŠçããŸããget_content_type()
ã¯å®å šãªMIMEã¿ã€ãïŒäŸïŒtext/plain
ïŒãè¿ããŸããget_content_charset()
ã¯Content-Type
ããããŒããæåã»ãããæœåºããŸããget_payload(decode=True)
ã¯éåžžã«éèŠã§ããããã¯*ãã³ãŒãããã*ã³ã³ãã³ãããã€ããšããŠè¿ããŸãããã®åŸãæ£ããæåã»ããã䜿çšããŠãããã®ãã€ãã.decode()
ããPythonæååãååŸããå¿ èŠããããŸãã
è§£æäžã®æ·»ä»ãã¡ã€ã«ã®åŠç
æ·»ä»ãã¡ã€ã«ããã«ãããŒãã¡ãã»ãŒãžã®äžéšã§ããContent-Disposition
ããããŒã䜿çšããŠããããèå¥ãããã³ãŒãããããã€ããŒããä¿åã§ããŸãã
from email.message import EmailMessage
from email import message_from_string
import os
# ã·ã³ãã«ãªæ·»ä»ãã¡ã€ã«ä»ãã®ã¡ãŒã«äŸ
email_with_attachment = """
From: attach@example.com
To: user@example.com
Subject: ããã¥ã¡ã³ããæ·»ä»
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="_----------=_XYZ"
--_----------=_XYZ
Content-Type: text/plain; charset="utf-8"
ãèŠæã®ããã¥ã¡ã³ãã§ãã
--_----------=_XYZ
Content-Type: application/pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="document.pdf"
JVBERi0xLjQKMSAwIG9iagpbL1BERi9UZXh0L0ltYWdlQy9JbWFnZUkvSW1hZ0VCXQplbmRvYmoK
--_----------=_XYZ--
"""
msg = message_from_string(email_with_attachment)
output_dir = 'parsed_attachments'
os.makedirs(output_dir, exist_ok=True)
print("\n--- æ·»ä»ãã¡ã€ã«ã®åŠç ---")
for part in msg.iter_attachments():
filename = part.get_filename()
if filename:
filepath = os.path.join(output_dir, filename)
try:
with open(filepath, 'wb') as f:
f.write(part.get_payload(decode=True))
print(f"æ·»ä»ãã¡ã€ã«ãä¿åããŸãã: {filepath} (ã¿ã€ã: {part.get_content_type()})")
except Exception as e:
print(f"{filename}ã®ä¿åäžã«ãšã©ãŒãçºçããŸãã: {e}")
else:
print(f"ãã¡ã€ã«åã®ãªãæ·»ä»ãã¡ã€ã«ãèŠã€ãããŸãã (ã³ã³ãã³ãã¿ã€ã: {part.get_content_type()})")
# åºåãã£ã¬ã¯ããªãã¯ãªãŒã³ã¢ãã
# import shutil
# shutil.rmtree(output_dir)
説æïŒ
iter_attachments()
ã¯ãæ·»ä»ãã¡ã€ã«ã§ããå¯èœæ§ãé«ãããŒãïŒã€ãŸããContent-Disposition: attachment
ããããŒãæã€ããŸãã¯ãã以å€ã«åé¡ãããªãããŒãïŒãç¹ã«çæããŸããget_filename()
ã¯Content-Disposition
ããããŒãããã¡ã€ã«åãæœåºããŸããpart.get_payload(decode=True)
ã¯ãbase64
ãŸãã¯quoted-printable
ãããã§ã«ãã³ãŒããããæ·»ä»ãã¡ã€ã«ã®çãã€ããªã³ã³ãã³ããååŸããŸãã
ãšã³ã³ãŒãã£ã³ã°ãšæåã»ããã®ãã³ãŒã
email
ããã±ãŒãžã¯ãget_payload(decode=True)
ãåŒã³åºãéã«ãäžè¬çãªè»¢éãšã³ã³ãŒãã£ã³ã°ïŒbase64
ãquoted-printable
ãªã©ïŒãèªåçã«ãã³ãŒãããåªããä»äºãããŸããããã¹ãã³ã³ãã³ãèªäœã«ã€ããŠã¯ãContent-Type
ããããŒã§æå®ãããcharset
ã䜿çšããããšããŸããæåã»ãããæå®ãããŠããªãå Žåãç¡å¹ãªå Žåã¯ãé©åã«åŠçããå¿
èŠããããããããŸããã
from email.message import EmailMessage
from email import message_from_string
# åé¡ãããå¯èœæ§ã®ããæåã»ããã®äŸ
email_latin1 = """
From: legacy@example.com
To: new_system@example.com
Subject: ç¹æ®æåïŒÃ éÃóú
Content-Type: text/plain; charset="iso-8859-1"
ãã®ã¡ãã»ãŒãžã«ã¯Latin-1æåãå«ãŸããŠããŸãïŒÃ éÃóú
"""
msg = message_from_string(email_latin1)
if msg.is_multipart():
for part in msg.iter_parts():
payload = part.get_payload(decode=True)
charset = part.get_content_charset() or 'utf-8'
try:
print(f"ãã³ãŒãæžã¿ïŒæåã»ãã: {charset}ïŒïŒ{payload.decode(charset)}")
except UnicodeDecodeError:
print(f"{charset}ã§ã®ãã³ãŒãã«å€±æããŸããããã©ãŒã«ããã¯ã詊è¡äž...")
# äžè¬çãªæåã»ããããŸãã¯æ³å®ãããå Žåã¯'latin-1'ã«ãã©ãŒã«ããã¯
print(f"ãã³ãŒãæžã¿ïŒãã©ãŒã«ãã㯠Latin-1ïŒïŒ{payload.decode('latin-1', errors='replace')}")
else:
payload = msg.get_payload(decode=True)
charset = msg.get_content_charset() or 'utf-8'
try:
print(f"ãã³ãŒãæžã¿ïŒæåã»ãã: {charset}ïŒïŒ{payload.decode(charset)}")
except UnicodeDecodeError:
print(f"{charset}ã§ã®ãã³ãŒãã«å€±æããŸããããã©ãŒã«ããã¯ã詊è¡äž...")
print(f"ãã³ãŒãæžã¿ïŒãã©ãŒã«ãã㯠Latin-1ïŒïŒ{payload.decode('latin-1', errors='replace')}")
説æïŒ
- åžžã«
Content-Type
ããããŒã§æå®ãããæåã»ããã䜿çšããããã«ããŠãã ããã - ç¹ã«å€æ§ã§éæšæºçãªãœãŒã¹ããã®ã¡ãŒã«ãæ±ãå Žåã¯ãå
ç¢æ§ã®ããã«
try-except UnicodeDecodeError
ãããã¯ã䜿çšããŠãã ããã errors='replace'
ãŸãã¯errors='ignore'
ã.decode()
ãšå ±ã«äœ¿çšããããšã§ã察象ãšã³ã³ãŒãã£ã³ã°ã«ãããã³ã°ã§ããªãæåãåŠçããã¯ã©ãã·ã¥ãé²ãããšãã§ããŸãã
é«åºŠãªè§£æã·ããªãª
å®éã®ã¡ãŒã«ã¯ããã¹ãããããã«ãããŒãæ§é ãæã€éåžžã«è€éãªå ŽåããããŸããemail
ããã±ãŒãžã®ååž°çãªæ§è³ªã«ããããããã®ããã²ãŒã·ã§ã³ã¯ç°¡åã§ããis_multipart()
ãšiter_parts()
ãçµã¿åãããããšã§ãæ·±ããã¹ããããã¡ãã»ãŒãžããã©ããŒã¹ã§ããŸãã
from email.message import EmailMessage
from email import message_from_string
def parse_email_part(part, indent=0):
prefix = " " * indent
content_type = part.get_content_type()
charset = part.get_content_charset() or 'N/A'
print(f"{prefix}ããŒãã¿ã€ã: {content_type}, æåã»ãã: {charset}")
if part.is_multipart():
for subpart in part.iter_parts():
parse_email_part(subpart, indent + 1)
elif part.get_filename(): # æ·»ä»ãã¡ã€ã«ã§ã
print(f"{prefix} æ·»ä»ãã¡ã€ã«: {part.get_filename()} (ãµã€ãº: {len(part.get_payload(decode=True))} ãã€ã)")
else: # éåžžã®ããã¹ã/HTMLæ¬æããŒãã§ã
payload = part.get_payload(decode=True)
try:
decoded_content = payload.decode(charset)
# print(f"{prefix} ã³ã³ãã³ãïŒæåã®100æåïŒïŒ{decoded_content[:100]}...") # ç°¡æœãã®ãã
except UnicodeDecodeError:
print(f"{prefix} ã³ã³ãã³ã: (ãã€ããªãŸãã¯ãã³ãŒãäžèœãªããã¹ã)")
complex_email_raw = """
From: complex@example.com
To: receiver@example.com
Subject: HTMLããã¬ãŒã³ããã¹ããæ·»ä»ãã¡ã€ã«ãå«ãè€éãªã¡ãŒã«
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="outer_boundary"
--outer_boundary
Content-Type: multipart/alternative; boundary="inner_boundary"
--inner_boundary
Content-Type: text/plain; charset="utf-8"
ãã¬ãŒã³ããã¹ãã³ã³ãã³ãã
--inner_boundary
Content-Type: text/html; charset="utf-8"
<html><body><h2>HTMLã³ã³ãã³ã</h2></body></html>
--inner_boundary--
--outer_boundary
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="data.bin"
SGVsbG8gV29ybGQh
--outer_boundary--
"""
msg = message_from_string(complex_email_raw)
print("\n--- è€éãªã¡ãŒã«æ§é ããã©ããŒã¹äž ---")
parse_email_part(msg)
説æïŒ
- ååž°é¢æ°
parse_email_part
ã¯ãã¡ãã»ãŒãžããªãŒå šäœãå·¡åããåã¬ãã«ã§ãã«ãããŒãéšåãæ·»ä»ãã¡ã€ã«ãæ¬æã³ã³ãã³ããèå¥ããæ¹æ³ã瀺ããŠããŸãã - ãã®ãã¿ãŒã³ã¯ãæ·±ããã¹ããããã¡ãŒã«ããç¹å®ã®çš®é¡ã®ã³ã³ãã³ããæœåºããéã«éåžžã«æè»ã§ãã
æ§ç¯ vs. è§£æïŒæ¯èŒèŠç¹
æ§ç¯ãšè§£æã¯ç°ãªãæäœã§ãããMIMEã¡ãã»ãŒãžåŠçãšããåãã³ã€ã³ã®è£è¡šã§ããäžæ¹ãçè§£ããããšã¯ãå¿ ç¶çã«ããäžæ¹ã®çè§£ãå©ããŸãã
æ§ç¯ïŒéä¿¡ïŒïŒ
- çŠç¹ïŒããããŒãã³ã³ãã³ããæ·»ä»ãã¡ã€ã«ãæšæºæºæ ã®MIMEæ§é ã«æ£ããçµã¿ç«ãŠãããšã
- äž»èŠããŒã«ïŒ
email.message.EmailMessage
ãšset_content()
ãadd_attachment()
ãadd_alternative()
ãadd_related()
ãªã©ã®ã¡ãœããã - äž»ãªèª²é¡ïŒæ£ããMIMEã¿ã€ããæåã»ããïŒç¹ã«ã°ããŒãã«ãµããŒãã®ããã®UTF-8ïŒã
Content-Transfer-Encoding
ãããã³é©åãªããããŒãã©ãŒãããã確å®ã«ããããšã誀ãããããšãã¡ãŒã«ãæ£ãã衚瀺ãããªããæ·»ä»ãã¡ã€ã«ãç Žæãããã¡ãã»ãŒãžãã¹ãã ãšããŠãã©ã°ä»ãããããªã©ã®åé¡ã«ã€ãªããå¯èœæ§ããããŸãã
è§£æïŒåä¿¡ïŒïŒ
- çŠç¹ïŒçã®ã¡ãŒã«ãã€ãã¹ããªãŒã ãæ§æèŠçŽ ã«åè§£ããç¹å®ã®ããããŒãæ¬æã³ã³ãã³ããæ·»ä»ãã¡ã€ã«ãæœåºããããšã
- äž»èŠããŒã«ïŒ
email.parser.BytesParser
ãŸãã¯email.message_from_bytes()
ã䜿çšããçµæãšããŠåŸãããEmailMessage
ãªããžã§ã¯ããis_multipart()
ãiter_parts()
ãget_payload()
ãget_filename()
ãªã©ã®ã¡ãœãããšããããŒã¢ã¯ã»ã¹ã§ããã²ãŒãããŸãã - äž»ãªèª²é¡ïŒäžæ£ãªåœ¢åŒã®ã¡ãŒã«ã®åŠçãæåãšã³ã³ãŒãã£ã³ã°ã®æ£ããèå¥ïŒç¹ã«ææ§ãªå ŽåïŒãæ¬ èœããããããŒã®åŠçã倿§ãªMIMEæ§é ããã®ããŒã¿å ç¢ãªæœåºã
EmailMessage
ã䜿çšããŠæ§ç¯ããã¡ãã»ãŒãžã¯ãBytesParser
ã«ãã£ãŠå®å
šã«è§£æå¯èœã§ããã¹ãã§ããåæ§ã«ãè§£æäžã«çæãããMIMEæ§é ãçè§£ããããšã§ãè€éãªã¡ãã»ãŒãžèªäœãã©ã®ããã«æ§ç¯ãã¹ããã«ã€ããŠã®æŽå¯ãåŸãããŸãã
Pythonã«ããã°ããŒãã«ãªã¡ãŒã«åŠçã®ããã®ãã¹ããã©ã¯ãã£ã¹
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ãšããåãããããŸãã¯å€æ§ãªã¡ãŒã«ãœãŒã¹ãåŠçããã¢ããªã±ãŒã·ã§ã³ã®å Žåã以äžã®ãã¹ããã©ã¯ãã£ã¹ãæ€èšããŠãã ããã
- UTF-8ãžã®æšæºåïŒæ§ç¯æãè§£ææã«æåŸ ããå Žåãããã¹ãŠã®ããã¹ãã³ã³ãã³ãã«åžžã«UTF-8ã䜿çšããŠãã ãããããã¯æåãšã³ã³ãŒãã£ã³ã°ã®ã°ããŒãã«æšæºã§ãããæååãïŒæåã®ç ŽæïŒãåé¿ããŸãã
- ã¡ãŒã«ã¢ãã¬ã¹ã®æ€èšŒïŒéä¿¡åã«ãåä¿¡è
ã®ã¡ãŒã«ã¢ãã¬ã¹ãæ€èšŒããŠé
ä¿¡å¯èœæ§ã確èªããŠãã ãããè§£ææã«ã¯ã
From
ãTo
ããŸãã¯Cc
ããããŒã«ç¡å¹ãŸãã¯äžæ£ãªåœ¢åŒã®ã¢ãã¬ã¹ãããå¯èœæ§ã«åããŠãã ããã - å³å¯ãªãã¹ãïŒHTMLãšæ·»ä»ãã¡ã€ã«ã®äžè²«ããã¬ã³ããªã³ã°ã確ä¿ããããã«ãããŸããŸãªã¡ãŒã«ã¯ã©ã€ã¢ã³ãïŒGmailãOutlookãApple MailãThunderbirdïŒããã³ãã©ãããã©ãŒã ã§ã¡ãŒã«æ§ç¯ããã¹ãããŠãã ãããè§£æã«ã€ããŠã¯ãç°åžžãªãšã³ã³ãŒãã£ã³ã°ãæ¬ èœããããããŒãè€éãªãã¹ãæ§é ãå«ãåºç¯ãªãµã³ãã«ã¡ãŒã«ã§ãã¹ãããŠãã ããã
- è§£ææžã¿å ¥åã®ãµãã¿ã€ãºïŒåä¿¡ã¡ãŒã«ããæœåºãããã³ã³ãã³ãã¯åžžã«ä¿¡é Œã§ããªããã®ãšããŠæ±ã£ãŠãã ããããŠã§ãã¢ããªã±ãŒã·ã§ã³ã§è¡šç€ºããå Žåã¯ãXSSæ»æãé²ãããã«HTMLã³ã³ãã³ãããµãã¿ã€ãºããŠãã ããããã¡ã€ã«ãä¿åããéã«ã¯ããã¹æšªææ»æããã®ä»ã®ã»ãã¥ãªãã£è匱æ§ãé²ãããã«ãæ·»ä»ãã¡ã€ã«ã®ãã¡ã€ã«åãšã¿ã€ããæ€èšŒããŠãã ããã
- å
ç¢ãªãšã©ãŒåŠçïŒãã€ããŒãã®ãã³ãŒããæ¬ èœããŠããå¯èœæ§ã®ããããããŒãžã®ã¢ã¯ã»ã¹æã«ã¯ãå
æ¬çãª
try-except
ãããã¯ãå®è£ ããŠãã ãããUnicodeDecodeError
ãKeyError
ãé©åã«åŠçããŠãã ããã - 倧容鿷»ä»ãã¡ã€ã«ã®åŠçïŒã¡ãŒã«ãµãŒããŒã®å¶éãè¶ ããªãããã«æ§ç¯æãšãéå°ãªã¡ã¢ãªäœ¿çšããã£ã¹ã¯å®¹éã®æ¶è²»ãé²ãããã«è§£ææã®äž¡æ¹ã§ãæ·»ä»ãã¡ã€ã«ã®ãµã€ãºã«æ³šæããŠãã ãããã·ã¹ãã ã§ãµããŒããããŠããå Žåã¯ã倧容鿷»ä»ãã¡ã€ã«ã®ã¹ããªãŒãã³ã°ãæ€èšããŠãã ããã
email.policy
ã®æŽ»çšïŒéèŠãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¡ãŒã«æšæºãžã®å³å¯ãªæºæ ã確å®ã«ããããã«ãæç€ºçã«email.policy
ïŒäŸïŒpolicy.SMTP
ïŒãéžæããŠãã ãããããã¯é ä¿¡å¯èœæ§ãšçžäºéçšæ§ã«åœ±é¿ãäžããå¯èœæ§ããããŸãã- ã¡ã¿ããŒã¿ã®ä¿åïŒè§£ææã«ã¯ãç¹ã«ã¡ãŒã«ã¢ãŒã«ã€ããŸãã¯è»¢éã·ã¹ãã ãæ§ç¯ããŠããå Žåãã©ã®ã¡ã¿ããŒã¿ïŒããããŒãå ã®å¢çæååïŒãä¿åããããšãéèŠããæ±ºå®ããŠãã ããã
çµè«
Pythonã®email
ããã±ãŒãžã¯ãã¡ãŒã«ãšããã°ã©ã ã§ããåãããå¿
èŠããããã¹ãŠã®äººã«ãšã£ãŠãä¿¡ããããªãã»ã©åŒ·åã§æè»ãªã©ã€ãã©ãªã§ããMIMEã¡ãã»ãŒãžã®æ§ç¯ãšåä¿¡ã¡ãŒã«ã®å
ç¢ãªè§£æã®äž¡æ¹ãç¿åŸããããšã§ãé«åºŠãªã¡ãŒã«èªååã·ã¹ãã ãæ§ç¯ããã¡ãŒã«ã¯ã©ã€ã¢ã³ããäœæããã¡ãŒã«ããŒã¿ãåæããã¡ãŒã«æ©èœãäºå®äžããããã¢ããªã±ãŒã·ã§ã³ã«çµ±åããèœåãæã«å
¥ããããšãã§ããŸãã
ãã®ããã±ãŒãžã¯MIMEã®æ ¹åºã«ããè€éããæ
éã«åŠçããéçºè
ãã¡ãŒã«ã®ããåãã®ã³ã³ãã³ããšããžãã¯ã«éäžã§ããããã«ããŸããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«ããŒãœãã©ã€ãºããããã¥ãŒã¹ã¬ã¿ãŒãéä¿¡ããå Žåã§ããèªååãããã·ã¹ãã ã¬ããŒãããéèŠãªããŒã¿ãæœåºããå Žåã§ããemail
ããã±ãŒãžãæ·±ãçè§£ããããšã¯ãä¿¡é Œæ§ãé«ããçžäºéçšå¯èœã§ãã°ããŒãã«å¯Ÿå¿ã®ã¡ãŒã«ãœãªã¥ãŒã·ã§ã³ãæ§ç¯ããäžã§éåžžã«äŸ¡å€ãããããšã蚌æãããã§ãããã